﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using InterfazGrafico.LibreriaClases.Clases;
using InterfazGrafico.LibreriaConstantes;
using InterfazGrafico.LibreriaConstantes.Elementos;

namespace InterfazGrafico.LibreriaClases.Propiedades
{
    /// <summary>
    /// Almacena las propiedades de un elemento específico.
    /// </summary>
    public class PSeleccionarDuplicados : Propiedades
    {
        /// <summary>
        /// Entrada de datos.
        /// </summary>
        public string Entrada
        {
            get
            {
                return this.getPropiedadString(CSeleccionarDuplicados.Entrada);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDuplicados.Entrada, value);
            }
        }

        /// <summary>
        /// Estructura de entrada y de salida.
        /// </summary>
        public string Estructura
        {
            get
            {
                return this.getPropiedadString(CSeleccionarDuplicados.Estructura);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDuplicados.Estructura, value);
            }
        }

        /// <summary>
        /// Lista de campos que conforman la clave de los datos.
        /// </summary>
        public List<string> ListaCamposClave
        {
            get
            {
                return this.getPropiedadListaString(CSeleccionarDuplicados.CamposClave);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDuplicados.CamposClave, value);
            }
        }

        /// <summary>
        /// Lista de salidas de datos.
        /// </summary>
        public List<string> ListaSalidas
        {
            get
            {
                return this.getPropiedadListaString(CSeleccionarDuplicados.Salidas);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDuplicados.Salidas, value);
            }
        }

        /// <summary>
        /// Lista de criterios de selección de duplicados.
        /// </summary>
        public List<string> ListaCriteriosDuplicados
        {
            get
            {
                return this.getPropiedadListaString(CSeleccionarDuplicados.CriteriosDuplicados);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDuplicados.CriteriosDuplicados, value);
            }
        }

        /// <summary>
        /// Lista de parametros de los criterios de selección.
        /// </summary>
        public List<string> ListaParametrosCriterios
        {
            get
            {
                return this.getPropiedadListaString(CSeleccionarDuplicados.ParametrosCriterios);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDuplicados.ParametrosCriterios, value);
            }
        }

        /// <summary>
        /// Campo en el que incluir un número secuencial de cada ventana de datos encontrada.
        /// </summary>
        public string CampoVentana
        {
            get
            {
                return this.getPropiedadString(CSeleccionarDuplicados.CampoVentana);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDuplicados.CampoVentana, value);
            }
        }

        /// <summary>
        /// Campo en el que incluir un número secuencial dentro de cada ventana de datos encontrada.
        /// </summary>
        public string CampoSecuencia
        {
            get
            {
                return this.getPropiedadString(CSeleccionarDuplicados.CampoSecuencia);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDuplicados.CampoSecuencia, value);
            }
        }

        /// <summary>
        /// Constructor por defecto.
        /// </summary>
        public PSeleccionarDuplicados()
            : base()
        {
        }

        /// <summary>
        /// Obtiene los parámetros a partir del fichero XML indicado.
        /// </summary>
        /// <param name="fichero">Fichero de configuración XML</param>
        override public void leer(string fichero)
        {
            try
            {
                base.leer(fichero);
                XmlDocument xml = LeerXml.AbrirFicheroParametros(fichero);

                try
                { this.Entrada = LeerXml.ObtenerValorCampo(xml, CSeleccionarDuplicados.RutaEntrada); }
                catch (Exception)
                { this.Entrada = string.Empty; };

                try
                { this.Estructura = LeerXml.ObtenerValorCampo(xml, CSeleccionarDuplicados.RutaEstructura); }
                catch (Exception)
                { this.Estructura = string.Empty; }

                // Claves
                try
                {
                    int numeroCampos = LeerXml.ObtenerNumeroNodosCampo(xml, CSeleccionarDuplicados.RutaClaves);
                    for (int indiceCampo = 0; indiceCampo < numeroCampos; indiceCampo++)
                    {
                        string campo = string.Empty;
                        try
                        { campo = LeerXml.ObtenerValorCampo(xml, CSeleccionarDuplicados.RutaClaves, indiceCampo); }
                        catch (Exception)
                        { continue; }
                        if (!string.Empty.Equals(campo))
                            this.ListaCamposClave.Add(campo);
                    }
                }
                catch (Exception)
                { this.ListaCamposClave = new List<string>(); }

                // Salidas
                try
                {
                    int numeroSalidas = LeerXml.ObtenerNumeroNodosCampo(xml, CSeleccionarDuplicados.RutaSalidas);
                    for (int indiceSalida = 0; indiceSalida < numeroSalidas; indiceSalida++)
                    {
                        string salida = string.Empty;
                        try
                        { salida = LeerXml.ObtenerValorCampo(xml, CSeleccionarDuplicados.RutaSalidas, indiceSalida, Constantes.NodoXMLActual + CSeleccionarDuplicados.NodoSalidaDatos); }
                        catch (Exception)
                        { continue; }
                        if (!string.Empty.Equals(salida))
                        {
                            this.ListaSalidas.Add(salida);

                            // Criterios selección duplicados
                            string criterio = string.Empty;
                            try
                            { criterio = LeerXml.ObtenerValorCampo(xml, CSeleccionarDuplicados.RutaSalidas, indiceSalida, Constantes.NodoXMLActual + CSeleccionarDuplicados.NodoSalidaDuplicados); }
                            catch (Exception)
                            { criterio = string.Empty; }
                            if (!new CListasFunciones().ListaFuncionesSeleccionDuplicados.Contains(criterio))
                                criterio = string.Empty;
                            this.ListaCriteriosDuplicados.Add(criterio);
                            // Parametros de criterios
                            string parametro = string.Empty;
                            try
                            { parametro = LeerXml.ObtenerValorCampo(xml, CSeleccionarDuplicados.RutaSalidas, indiceSalida, "./" + CSeleccionarDuplicados.NodoSalidaParametro); }
                            catch (Exception)
                            { parametro = string.Empty; }
                            this.ListaParametrosCriterios.Add(parametro);
                        }
                    }

                    // Campo secuencia de ventana
                    try
                    { this.CampoVentana = LeerXml.ObtenerValorCampo(xml, CSeleccionarDuplicados.RutaVentana); }
                    catch (Exception)
                    { this.CampoVentana = string.Empty; }

                    // Campo secuencia dentro de cada ventana
                    try
                    { this.CampoSecuencia = LeerXml.ObtenerValorCampo(xml, CSeleccionarDuplicados.RutaSecuencia); }
                    catch (Exception)
                    { this.CampoSecuencia = string.Empty; }
                }
                catch (Exception)
                {
                    this.ListaSalidas = new List<string>();
                    this.ListaCriteriosDuplicados = new List<string>();
                    this.ListaParametrosCriterios = new List<string>();
                }
            }
            catch (Exception ex)
            {
                throw new ApplicationException(Constantes.ERROR_LECTURA_FICHERO_CONFIGURACION, ex);
            }
        }

        /// <summary>
        /// Escribe los parámetros al fichero XML indicado.
        /// </summary>
        /// <param name="fichero">Fichero de configuración XML</param>
        public override void escribir(string fichero)
        {
            try
            {
                base.escribir(fichero);
                XmlWriter xml = EscribirXml.AbrirFicheroParametros(fichero);
                EscribirXml.InicioElemento(xml, CSeleccionarDuplicados.NodoRaiz);
                EscribirXml.EscribeNodo(xml, CSeleccionarDuplicados.NodoEntrada, Entrada);
                EscribirXml.EscribeNodo(xml, CSeleccionarDuplicados.NodoEstructura, Estructura);

                // Configuracion
                EscribirXml.InicioElemento(xml, CSeleccionarDuplicados.NodoConfiguracion);

                EscribirXml.InicioElemento(xml, CSeleccionarDuplicados.NodoClaves);
                foreach (string campo in ListaCamposClave)
                    EscribirXml.EscribeNodo(xml, CSeleccionarDuplicados.NodoClavesClave, campo);
                EscribirXml.FinElemento(xml);

                EscribirXml.InicioElemento(xml, CSeleccionarDuplicados.NodoSalidas);
                for (int indiceSalida = 0; indiceSalida < ListaSalidas.Count; indiceSalida++)
                {
                    EscribirXml.InicioElemento(xml, CSeleccionarDuplicados.NodoSalida);
                    EscribirXml.EscribeNodo(xml, CSeleccionarDuplicados.NodoSalidaDatos, ListaSalidas[indiceSalida]);
                    EscribirXml.EscribeNodo(xml, CSeleccionarDuplicados.NodoSalidaDuplicados, ListaCriteriosDuplicados[indiceSalida]);
                    EscribirXml.EscribeNodo(xml, CSeleccionarDuplicados.NodoSalidaParametro, ListaParametrosCriterios[indiceSalida]);
                    EscribirXml.FinElemento(xml);
                }
                EscribirXml.FinElemento(xml);

                EscribirXml.EscribeNodo(xml, CSeleccionarDuplicados.NodoCampoVentana, CampoVentana);
                EscribirXml.EscribeNodo(xml, CSeleccionarDuplicados.NodoCampoSecuencia, CampoSecuencia);

                EscribirXml.FinElemento(xml);
                EscribirXml.FinElemento(xml);
                EscribirXml.Flush(xml);
                EscribirXml.Close(xml);
            }
            catch (Exception ex)
            {
                throw new ApplicationException(Constantes.ERROR_ESCRITURA_FICHERO_CONFIGURACION, ex);
            }
        }
    }
}
 